<!doctype html>
<html class="no-js" lang="en, zh-CN" data-content_root="../">
  <head><meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width,initial-scale=1"/>
    <meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<link rel="index" title="Index" href="../genindex.html" /><link rel="search" title="Search" href="../search.html" /><link rel="prev" title="Javet Performance" href="performance.html" />

    <link rel="shortcut icon" href="../_static/logo.ico"/><!-- Generated with Sphinx 7.3.6 and Furo 2024.01.29 -->
        <title>Debug with Chrome Developer Tools - Javet 3.1.3 documentation</title>
      <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=a746c00c" />
    <link rel="stylesheet" type="text/css" href="../_static/styles/furo.css?v=135e06be" />
    <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=4c969af8" />
    <link rel="stylesheet" type="text/css" href="../_static/styles/furo-extensions.css?v=36a5483c" />
    <link rel="stylesheet" type="text/css" href="../_static/css/custom.css?v=c2631171" />
    
    


<style>
  body {
    --color-code-background: #f8f8f8;
  --color-code-foreground: black;
  
  }
  @media not print {
    body[data-theme="dark"] {
      --color-code-background: #202020;
  --color-code-foreground: #d0d0d0;
  
    }
    @media (prefers-color-scheme: dark) {
      body:not([data-theme="light"]) {
        --color-code-background: #202020;
  --color-code-foreground: #d0d0d0;
  
      }
    }
  }
</style></head>
  <body>
    
    <script>
      document.body.dataset.theme = localStorage.getItem("theme") || "auto";
    </script>
    

<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
  <symbol id="svg-toc" viewBox="0 0 24 24">
    <title>Contents</title>
    <svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024">
      <path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/>
    </svg>
  </symbol>
  <symbol id="svg-menu" viewBox="0 0 24 24">
    <title>Menu</title>
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
      stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
      <line x1="3" y1="12" x2="21" y2="12"></line>
      <line x1="3" y1="6" x2="21" y2="6"></line>
      <line x1="3" y1="18" x2="21" y2="18"></line>
    </svg>
  </symbol>
  <symbol id="svg-arrow-right" viewBox="0 0 24 24">
    <title>Expand</title>
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
      stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
      <polyline points="9 18 15 12 9 6"></polyline>
    </svg>
  </symbol>
  <symbol id="svg-sun" viewBox="0 0 24 24">
    <title>Light mode</title>
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
      stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
      <circle cx="12" cy="12" r="5"></circle>
      <line x1="12" y1="1" x2="12" y2="3"></line>
      <line x1="12" y1="21" x2="12" y2="23"></line>
      <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
      <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
      <line x1="1" y1="12" x2="3" y2="12"></line>
      <line x1="21" y1="12" x2="23" y2="12"></line>
      <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
      <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
    </svg>
  </symbol>
  <symbol id="svg-moon" viewBox="0 0 24 24">
    <title>Dark mode</title>
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
      stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
      <path stroke="none" d="M0 0h24v24H0z" fill="none" />
      <path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
    </svg>
  </symbol>
  <symbol id="svg-sun-half" viewBox="0 0 24 24">
    <title>Auto light/dark mode</title>
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
      stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-shadow">
      <path stroke="none" d="M0 0h24v24H0z" fill="none"/>
      <circle cx="12" cy="12" r="9" />
      <path d="M13 12h5" />
      <path d="M13 15h4" />
      <path d="M13 18h1" />
      <path d="M13 9h4" />
      <path d="M13 6h1" />
    </svg>
  </symbol>
</svg>

<input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation">
<input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc">
<label class="overlay sidebar-overlay" for="__navigation">
  <div class="visually-hidden">Hide navigation sidebar</div>
</label>
<label class="overlay toc-overlay" for="__toc">
  <div class="visually-hidden">Hide table of contents sidebar</div>
</label>



<div class="page">
  <header class="mobile-header">
    <div class="header-left">
      <label class="nav-overlay-icon" for="__navigation">
        <div class="visually-hidden">Toggle site navigation sidebar</div>
        <i class="icon"><svg><use href="#svg-menu"></use></svg></i>
      </label>
    </div>
    <div class="header-center">
      <a href="../index.html"><div class="brand">Javet 3.1.3 documentation</div></a>
    </div>
    <div class="header-right">
      <div class="theme-toggle-container theme-toggle-header">
        <button class="theme-toggle">
          <div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
          <svg class="theme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
          <svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
          <svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
        </button>
      </div>
      <label class="toc-overlay-icon toc-header-icon" for="__toc">
        <div class="visually-hidden">Toggle table of contents sidebar</div>
        <i class="icon"><svg><use href="#svg-toc"></use></svg></i>
      </label>
    </div>
  </header>
  <aside class="sidebar-drawer">
    <div class="sidebar-container">
      
      <div class="sidebar-sticky"><a class="sidebar-brand" href="../index.html">
  
  <div class="sidebar-logo-container">
    <img class="sidebar-logo" src="../_static/logo.png" alt="Logo"/>
  </div>
  
  <span class="sidebar-brand-text">Javet 3.1.3 documentation</span>
  
</a><form class="sidebar-search-container" method="get" action="../search.html" role="search">
  <input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
  <input type="hidden" name="check_keywords" value="yes">
  <input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
  <ul class="current">
<li class="toctree-l1 has-children"><a class="reference internal" href="../tutorial/index.html">Tutorial</a><input class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><div class="visually-hidden">Toggle navigation of Tutorial</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l2 has-children"><a class="reference internal" href="../tutorial/basic/index.html">Basic</a><input class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" role="switch" type="checkbox"/><label for="toctree-checkbox-2"><div class="visually-hidden">Toggle navigation of Basic</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../tutorial/basic/installation.html">Installation</a></li>
<li class="toctree-l3"><a class="reference internal" href="../tutorial/basic/hello_javet.html">Hello Javet</a></li>
<li class="toctree-l3"><a class="reference internal" href="../tutorial/basic/javet_shell.html">Javet Shell</a></li>
<li class="toctree-l3"><a class="reference internal" href="../tutorial/basic/interception.html">Interception</a></li>
<li class="toctree-l3"><a class="reference internal" href="../tutorial/basic/engine_pool.html">Javet Engine Pool</a></li>
<li class="toctree-l3"><a class="reference internal" href="../tutorial/basic/node_js_mode_and_v8_mode.html">Node.js Mode and V8 Mode</a></li>
<li class="toctree-l3"><a class="reference internal" href="../tutorial/basic/spring_integration.html">Spring Integration</a></li>
<li class="toctree-l3"><a class="reference internal" href="../tutorial/basic/polyfill.html">Polyfill</a></li>
</ul>
</li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../tutorial/advanced/index.html">Advanced</a><input class="toctree-checkbox" id="toctree-checkbox-3" name="toctree-checkbox-3" role="switch" type="checkbox"/><label for="toctree-checkbox-3"><div class="visually-hidden">Toggle navigation of Advanced</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../tutorial/advanced/interact_with_node_js.html">Interact with Node.js</a></li>
<li class="toctree-l3"><a class="reference internal" href="../tutorial/advanced/object_converter.html">Object Converter</a></li>
<li class="toctree-l3"><a class="reference internal" href="../tutorial/advanced/java_and_javascript_interop.html">Java and JavaScript Interop</a></li>
<li class="toctree-l3"><a class="reference internal" href="../tutorial/advanced/access_the_whole_jvm.html">Access the Whole JVM</a></li>
<li class="toctree-l3"><a class="reference internal" href="../tutorial/advanced/expose_json_node_in_v8.html">Expose JsonNode in V8</a></li>
</ul>
</li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../tutorial/migration_guides/index.html">Migration Guides</a><input class="toctree-checkbox" id="toctree-checkbox-4" name="toctree-checkbox-4" role="switch" type="checkbox"/><label for="toctree-checkbox-4"><div class="visually-hidden">Toggle navigation of Migration Guides</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../tutorial/migration_guides/migrate_from_j2v8.html">Migrate from J2V8</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../reference/index.html">Reference</a><input class="toctree-checkbox" id="toctree-checkbox-5" name="toctree-checkbox-5" role="switch" type="checkbox"/><label for="toctree-checkbox-5"><div class="visually-hidden">Toggle navigation of Reference</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../reference/javadoc/index.html">API Reference</a></li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../reference/v8_values/index.html">V8 Values</a><input class="toctree-checkbox" id="toctree-checkbox-6" name="toctree-checkbox-6" role="switch" type="checkbox"/><label for="toctree-checkbox-6"><div class="visually-hidden">Toggle navigation of V8 Values</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../reference/v8_values/v8_collection.html">V8 Collection</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/v8_values/v8_function.html">V8 Function</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/v8_values/v8_promise.html">V8 Promise</a></li>
</ul>
</li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../reference/converters/index.html">Converters</a><input class="toctree-checkbox" id="toctree-checkbox-7" name="toctree-checkbox-7" role="switch" type="checkbox"/><label for="toctree-checkbox-7"><div class="visually-hidden">Toggle navigation of Converters</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../reference/converters/primitive_converter.html">Primitive Converter</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/converters/object_converter.html">Object Converter</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/converters/proxy_converter.html">Proxy Converter</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/converters/bridge_converter.html">Bridge Converter</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/converters/custom_converter.html">Custom Converter</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/converters/proxy_plugins.html">Proxy Plugins</a></li>
</ul>
</li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../reference/resource_management/index.html">Resource Management</a><input class="toctree-checkbox" id="toctree-checkbox-8" name="toctree-checkbox-8" role="switch" type="checkbox"/><label for="toctree-checkbox-8"><div class="visually-hidden">Toggle navigation of Resource Management</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../reference/resource_management/load_and_unload.html">Load and Unload</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/resource_management/lock.html">Know the Lock</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/resource_management/memory_management.html">Memory Management</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/resource_management/modularization.html">Modularization</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/resource_management/snapshot.html">Snapshot</a></li>
</ul>
</li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../reference/troubleshooting/index.html">Troubleshooting</a><input class="toctree-checkbox" id="toctree-checkbox-9" name="toctree-checkbox-9" role="switch" type="checkbox"/><label for="toctree-checkbox-9"><div class="visually-hidden">Toggle navigation of Troubleshooting</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../reference/troubleshooting/error_codes.html">Error Codes</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/troubleshooting/logging.html">Logging</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/troubleshooting/termination.html">Termination</a></li>
</ul>
</li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../reference/tips/index.html">Tips</a><input class="toctree-checkbox" id="toctree-checkbox-10" name="toctree-checkbox-10" role="switch" type="checkbox"/><label for="toctree-checkbox-10"><div class="visually-hidden">Toggle navigation of Tips</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../reference/tips/best_practices.html">Best Practices</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../reference/todo_list.html">TODO List</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../release_notes/index.html">Release Notes</a><input class="toctree-checkbox" id="toctree-checkbox-11" name="toctree-checkbox-11" role="switch" type="checkbox"/><label for="toctree-checkbox-11"><div class="visually-hidden">Toggle navigation of Release Notes</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../release_notes/release_notes_3_1.html">Release Notes 3.1.x</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../faq/index.html">FAQ</a><input class="toctree-checkbox" id="toctree-checkbox-12" name="toctree-checkbox-12" role="switch" type="checkbox"/><label for="toctree-checkbox-12"><div class="visually-hidden">Toggle navigation of FAQ</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l2 has-children"><a class="reference internal" href="../faq/background/index.html">Background</a><input class="toctree-checkbox" id="toctree-checkbox-13" name="toctree-checkbox-13" role="switch" type="checkbox"/><label for="toctree-checkbox-13"><div class="visually-hidden">Toggle navigation of Background</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../faq/background/history_with_j2v8.html">History with J2V8</a></li>
<li class="toctree-l3"><a class="reference internal" href="../faq/background/what_is_the_motivation.html">What is the Motivation?</a></li>
</ul>
</li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../faq/development/index.html">Development</a><input class="toctree-checkbox" id="toctree-checkbox-14" name="toctree-checkbox-14" role="switch" type="checkbox"/><label for="toctree-checkbox-14"><div class="visually-hidden">Toggle navigation of Development</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../faq/development/can_native_image_be_supported.html">Can Native Image be Supported?</a></li>
<li class="toctree-l3"><a class="reference internal" href="../faq/development/how_to_think_in_javet.html">How to Think in Javet?</a></li>
<li class="toctree-l3"><a class="reference internal" href="../faq/development/where_are_es6_api_in_v8_mode.html">Where are ES6 API in V8 Mode?</a></li>
<li class="toctree-l3"><a class="reference internal" href="../faq/development/where_are_the_examples.html">Where are the Examples?</a></li>
<li class="toctree-l3"><a class="reference internal" href="../faq/development/why_is_the_inspector_disabled_in_node_js_mode.html">Why is the Inspector Disabled in Node.js Mode?</a></li>
</ul>
</li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../faq/environment/index.html">Environment</a><input class="toctree-checkbox" id="toctree-checkbox-15" name="toctree-checkbox-15" role="switch" type="checkbox"/><label for="toctree-checkbox-15"><div class="visually-hidden">Toggle navigation of Environment</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../faq/environment/can_javet_support_legacy_linux.html">Can Javet Support Legacy Linux?</a></li>
</ul>
</li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../faq/troubleshooting/index.html">Troubleshooting</a><input class="toctree-checkbox" id="toctree-checkbox-16" name="toctree-checkbox-16" role="switch" type="checkbox"/><label for="toctree-checkbox-16"><div class="visually-hidden">Toggle navigation of Troubleshooting</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../faq/troubleshooting/a_dynamic_link_library_dll_initialization_routine_failed.html">A dynamic link library (DLL) initialization routine failed</a></li>
<li class="toctree-l3"><a class="reference internal" href="../faq/troubleshooting/can_i18n_be_supported.html">Can i18n be Supported?</a></li>
<li class="toctree-l3"><a class="reference internal" href="../faq/troubleshooting/can_i_debug_javet_in_chrome_dev_tools.html">Can I Debug Javet in Chrome DevTools?</a></li>
<li class="toctree-l3"><a class="reference internal" href="../faq/troubleshooting/sigsegv_at_createv8runtime_in_v8_mode_on_aws.html">SIGSEGV at createV8Runtime() in V8 Mode on AWS</a></li>
<li class="toctree-l3"><a class="reference internal" href="../faq/troubleshooting/why_node_js_crashes_when_being_closed.html">Why Node.js Crashes When being Closed?</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1 current has-children"><a class="reference internal" href="index.html">Development</a><input checked="" class="toctree-checkbox" id="toctree-checkbox-17" name="toctree-checkbox-17" role="switch" type="checkbox"/><label for="toctree-checkbox-17"><div class="visually-hidden">Toggle navigation of Development</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="tools.html">Development Tools</a></li>
<li class="toctree-l2 has-children"><a class="reference internal" href="build.html">Build Javet</a><input class="toctree-checkbox" id="toctree-checkbox-18" name="toctree-checkbox-18" role="switch" type="checkbox"/><label for="toctree-checkbox-18"><div class="visually-hidden">Toggle navigation of Build Javet</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l3"><a class="reference internal" href="build_javet_with_docker.html">Build Javet with Docker</a></li>
<li class="toctree-l3"><a class="reference internal" href="build_javet_from_scratch.html">Build Javet from Scratch</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="test.html">Test Javet</a></li>
<li class="toctree-l2"><a class="reference internal" href="design.html">Javet Design</a></li>
<li class="toctree-l2"><a class="reference internal" href="performance.html">Javet Performance</a></li>
<li class="toctree-l2 current current-page"><a class="current reference internal" href="#">Debug with Chrome Developer Tools</a></li>
</ul>
</li>
</ul>

</div>
</div>

      </div>
      
    </div>
  </aside>
  <div class="main">
    <div class="content">
      <div class="article-container">
        <a href="#" class="back-to-top muted-link">
          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
            <path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
          </svg>
          <span>Back to top</span>
        </a>
        <div class="content-icon-container">
          
<div class="theme-toggle-container theme-toggle-content">
            <button class="theme-toggle">
              <div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
              <svg class="theme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
              <svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
              <svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
            </button>
          </div>
          <label class="toc-overlay-icon toc-content-icon" for="__toc">
            <div class="visually-hidden">Toggle table of contents sidebar</div>
            <i class="icon"><svg><use href="#svg-toc"></use></svg></i>
          </label>
        </div>
        <article role="main">
          <section id="debug-with-chrome-developer-tools">
<h1>Debug with Chrome Developer Tools<a class="headerlink" href="#debug-with-chrome-developer-tools" title="Link to this heading">¶</a></h1>
<p><a class="reference external" href="https://developers.google.com/web/tools/chrome-devtools">Chrome DevTools</a> (aka. CDT) is a set of web developer tools built directly into the Google Chrome browser. DevTools can help you edit pages on-the-fly and diagnose problems quickly, which ultimately helps you build better websites, faster.</p>
<section id="cdt-shell">
<h2>CDT Shell<a class="headerlink" href="#cdt-shell" title="Link to this heading">¶</a></h2>
<p>Javet ships a demo <a class="reference external" href="https://github.com/caoccao/Javet/tree/main/1/2/../../src/test/java/com/caoccao/javet/tutorial/cdt/TestCDT.java">CDT Shell</a> application to demonstrate how to work with CDT to perform a live debugging.</p>
<section id="run-cdt-shell">
<h3>1. Run CDT Shell<a class="headerlink" href="#run-cdt-shell" title="Link to this heading">¶</a></h3>
<p>Run CDT Shell as a normal Java console application and an interactive console will appear working just like a node console does.</p>
</section>
<section id="run-script-in-cdt-shell">
<h3>2. Run Script in CDT Shell<a class="headerlink" href="#run-script-in-cdt-shell" title="Link to this heading">¶</a></h3>
<p>Run arbitrary code in the console just like what can be done in a node console.</p>
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="o">&gt;</span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">3</span>
<span class="kc">undefined</span>
<span class="o">&gt;</span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">4</span>
<span class="kc">undefined</span>
<span class="o">&gt;</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">b</span>
<span class="mf">7</span>
</pre></div>
</div>
</section>
<section id="open-cdt">
<h3>3. Open CDT<a class="headerlink" href="#open-cdt" title="Link to this heading">¶</a></h3>
<p>Open <a class="reference external" href="chrome://inspect/">chrome://inspect/</a> in Chrome, wait a few seconds and Javet will appear as a remote target.</p>
<img alt="Remote Target Javet" src="../_images/chome_developer_tools_devices_remote_target_javet.png" />
</section>
<section id="debug-as-usual">
<h3>4. Debug as Usual<a class="headerlink" href="#debug-as-usual" title="Link to this heading">¶</a></h3>
<p>Click <code class="docutils literal notranslate"><span class="pre">inspect</span></code>. Voilà, DevTools is up. As the screenshot shows, live evaluation and auto-completion work successfully. Enjoy the live debugging.</p>
<img alt="Remote Target Javet" src="../_images/chome_developer_tools_console.png" />
</section>
</section>
<section id="chrome-developer-tools-internals">
<h2>Chrome Developer Tools Internals<a class="headerlink" href="#chrome-developer-tools-internals" title="Link to this heading">¶</a></h2>
<section id="handshake">
<h3>Handshake<a class="headerlink" href="#handshake" title="Link to this heading">¶</a></h3>
<ul class="simple">
<li><p>CDT Shell listens to port 9229 by default because CDT constantly queries <a class="reference external" href="http://127.0.0.1:9229/json/list">http://127.0.0.1:9229/json/list</a> for a list of remote targets. CDT Shell tells CDT that it is a node flavored remote target via <a class="reference external" href="http://127.0.0.1:9229/json/list">http://127.0.0.1:9229/json/list</a> and the websocket address is <code class="docutils literal notranslate"><span class="pre">ws://127.0.0.1:9229/javet</span></code>.</p></li>
<li><p>CDT queries <a class="reference external" href="http://127.0.0.1:9229/json/version">http://127.0.0.1:9229/json/version</a> for protocol version. CDT Shell currently uses v1.3. The complete protocol API docs are available at <a class="reference external" href="https://chromedevtools.github.io/devtools-protocol/">https://chromedevtools.github.io/devtools-protocol/</a>.</p></li>
<li><p>CDT queries <a class="reference external" href="http://127.0.0.1:9229/javet/list">http://127.0.0.1:9229/javet/list</a> with a websocket upgrade request. CDT Shell responses with websocket upgrade accepted.</p></li>
<li><p>CDT switches to <code class="docutils literal notranslate"><span class="pre">ws://127.0.0.1:9229/javet</span></code> and sends the following 8 messages to perform a handshake with a node flavored remote target.</p></li>
</ul>
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="nx">Chrome</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="o">:</span><span class="mf">1</span><span class="p">,</span><span class="s2">&quot;method&quot;</span><span class="o">:</span><span class="s2">&quot;Runtime.enable&quot;</span><span class="p">,</span><span class="s2">&quot;params&quot;</span><span class="o">:</span><span class="p">{}}</span>
<span class="nx">Javet</span><span class="w"> </span><span class="nx">Notification</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">&quot;method&quot;</span><span class="o">:</span><span class="s2">&quot;Runtime.executionContextCreated&quot;</span><span class="p">,</span><span class="s2">&quot;params&quot;</span><span class="o">:</span><span class="p">{</span><span class="s2">&quot;context&quot;</span><span class="o">:</span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="o">:</span><span class="mf">1</span><span class="p">,</span><span class="s2">&quot;origin&quot;</span><span class="o">:</span><span class="s2">&quot;&quot;</span><span class="p">,</span><span class="s2">&quot;name&quot;</span><span class="o">:</span><span class="s2">&quot;Javet Inspector 00000000&quot;</span><span class="p">,</span><span class="s2">&quot;uniqueId&quot;</span><span class="o">:</span><span class="s2">&quot;00000000.00000000&quot;</span><span class="p">}}}</span>
<span class="nx">Javet</span><span class="w"> </span><span class="nx">Response</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="o">:</span><span class="mf">1</span><span class="p">,</span><span class="s2">&quot;result&quot;</span><span class="o">:</span><span class="p">{}}</span>
<span class="nx">Chrome</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="o">:</span><span class="mf">2</span><span class="p">,</span><span class="s2">&quot;method&quot;</span><span class="o">:</span><span class="s2">&quot;Debugger.enable&quot;</span><span class="p">,</span><span class="s2">&quot;params&quot;</span><span class="o">:</span><span class="p">{</span><span class="s2">&quot;maxScriptsCacheSize&quot;</span><span class="o">:</span><span class="mf">100000000</span><span class="p">}}</span>
<span class="nx">Javet</span><span class="w"> </span><span class="nx">Response</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="o">:</span><span class="mf">2</span><span class="p">,</span><span class="s2">&quot;result&quot;</span><span class="o">:</span><span class="p">{</span><span class="s2">&quot;debuggerId&quot;</span><span class="o">:</span><span class="s2">&quot;00000000.00000000&quot;</span><span class="p">}}</span>
<span class="nx">Chrome</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="o">:</span><span class="mf">3</span><span class="p">,</span><span class="s2">&quot;method&quot;</span><span class="o">:</span><span class="s2">&quot;Debugger.setPauseOnExceptions&quot;</span><span class="p">,</span><span class="s2">&quot;params&quot;</span><span class="o">:</span><span class="p">{</span><span class="s2">&quot;state&quot;</span><span class="o">:</span><span class="s2">&quot;none&quot;</span><span class="p">}}</span>
<span class="nx">Javet</span><span class="w"> </span><span class="nx">Response</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="o">:</span><span class="mf">3</span><span class="p">,</span><span class="s2">&quot;result&quot;</span><span class="o">:</span><span class="p">{}}</span>
<span class="nx">Chrome</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="o">:</span><span class="mf">4</span><span class="p">,</span><span class="s2">&quot;method&quot;</span><span class="o">:</span><span class="s2">&quot;Debugger.setAsyncCallStackDepth&quot;</span><span class="p">,</span><span class="s2">&quot;params&quot;</span><span class="o">:</span><span class="p">{</span><span class="s2">&quot;maxDepth&quot;</span><span class="o">:</span><span class="mf">32</span><span class="p">}}</span>
<span class="nx">Javet</span><span class="w"> </span><span class="nx">Response</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="o">:</span><span class="mf">4</span><span class="p">,</span><span class="s2">&quot;result&quot;</span><span class="o">:</span><span class="p">{}}</span>
<span class="nx">Chrome</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="o">:</span><span class="mf">5</span><span class="p">,</span><span class="s2">&quot;method&quot;</span><span class="o">:</span><span class="s2">&quot;Profiler.enable&quot;</span><span class="p">,</span><span class="s2">&quot;params&quot;</span><span class="o">:</span><span class="p">{}}</span>
<span class="nx">Javet</span><span class="w"> </span><span class="nx">Response</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="o">:</span><span class="mf">5</span><span class="p">,</span><span class="s2">&quot;result&quot;</span><span class="o">:</span><span class="p">{}}</span>
<span class="nx">Chrome</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="o">:</span><span class="mf">6</span><span class="p">,</span><span class="s2">&quot;method&quot;</span><span class="o">:</span><span class="s2">&quot;Runtime.getIsolateId&quot;</span><span class="p">,</span><span class="s2">&quot;params&quot;</span><span class="o">:</span><span class="p">{}}</span>
<span class="nx">Javet</span><span class="w"> </span><span class="nx">Response</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="o">:</span><span class="mf">6</span><span class="p">,</span><span class="s2">&quot;result&quot;</span><span class="o">:</span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="o">:</span><span class="s2">&quot;00000000&quot;</span><span class="p">}}</span>
<span class="nx">Chrome</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="o">:</span><span class="mf">7</span><span class="p">,</span><span class="s2">&quot;method&quot;</span><span class="o">:</span><span class="s2">&quot;Debugger.setBlackboxPatterns&quot;</span><span class="p">,</span><span class="s2">&quot;params&quot;</span><span class="o">:</span><span class="p">{</span><span class="s2">&quot;patterns&quot;</span><span class="o">:</span><span class="p">[]}}</span>
<span class="nx">Javet</span><span class="w"> </span><span class="nx">Response</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="o">:</span><span class="mf">7</span><span class="p">,</span><span class="s2">&quot;result&quot;</span><span class="o">:</span><span class="p">{}}</span>
<span class="nx">Chrome</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="o">:</span><span class="mf">8</span><span class="p">,</span><span class="s2">&quot;method&quot;</span><span class="o">:</span><span class="s2">&quot;Runtime.runIfWaitingForDebugger&quot;</span><span class="p">,</span><span class="s2">&quot;params&quot;</span><span class="o">:</span><span class="p">{}}</span>
<span class="nx">Javet</span><span class="w"> </span><span class="nx">Response</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="o">:</span><span class="mf">8</span><span class="p">,</span><span class="s2">&quot;result&quot;</span><span class="o">:</span><span class="p">{}}</span>
</pre></div>
</div>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Method <code class="docutils literal notranslate"><span class="pre">Runtime.runIfWaitingForDebugger</span></code> can be regarded as the handshake completion and there is no need to parse this message because it is exposed as a callback in <code class="docutils literal notranslate"><span class="pre">IV8InspectorListener</span></code>.</p>
</div>
<p>Actually, inside V8, the first message can enable the debugging without the rest of them. Please refer to the <a class="reference external" href="https://github.com/caoccao/Javet/tree/main/1/2/../../src/test/java/com/caoccao/javet/interop/TestV8Inspector.java">source code</a> for details.</p>
</section>
</section>
<section id="customization">
<h2>Customization<a class="headerlink" href="#customization" title="Link to this heading">¶</a></h2>
<p>Yes, please feel free to customize the debugging server in your environment. CDT Shell is created as a showcase for further customization. Here are some tips.</p>
<ul>
<li><p>Integrate with your HTTP and WebSocket servers. CDT Shell currently uses embedded Jetty. Be careful, HTTP and WebSocket servers need to be hosted together, otherwise, CDT refuses to communicate with the WebSocket server.</p></li>
<li><p>Add your <code class="docutils literal notranslate"><span class="pre">IV8InspectorListener</span></code> to intercept all the event messages. In practice, a decent JSON library like JackSon, GSon may help interpret those messages. As a demo, CDT Shell doesn't process those messages. Why intercept those messages? Because:</p>
<blockquote>
<div><ul class="simple">
<li><p>To set up breakpoints before script is executed.</p></li>
<li><p>To send messages to CDT right after CDT is connected.</p></li>
<li><p>To turn on / off certain features.</p></li>
<li><p>To enforce authentication and authorization.</p></li>
<li><p>To switch among V8 runtimes.</p></li>
</ul>
</div></blockquote>
</li>
</ul>
</section>
<section id="faqs">
<h2>FAQs<a class="headerlink" href="#faqs" title="Link to this heading">¶</a></h2>
<section id="does-it-support-node-js-mode">
<h3>Does it Support Node.js Mode?<a class="headerlink" href="#does-it-support-node-js-mode" title="Link to this heading">¶</a></h3>
<p>Yes, Javet V8 inspector supports the Node.js Mode as well as the V8 mode though the built-in Node.js inspector is disabled because of some other issues. Please visit <a class="reference internal" href="../faq/development/why_is_the_inspector_disabled_in_node_js_mode.html"><span class="doc">Why is the Inspector Disabled in Node.js Mode?</span></a> for more details.</p>
</section>
<section id="is-there-a-live-demo">
<h3>Is There a Live Demo?<a class="headerlink" href="#is-there-a-live-demo" title="Link to this heading">¶</a></h3>
<p>Yes, <a class="reference external" href="https://github.com/caoccao/JavetShell">JavetShell</a> provides a live demo via either a jar file or a docker image.</p>
</section>
</section>
</section>

        </article>
      </div>
      <footer>
        
        <div class="related-pages">
          
          <a class="prev-page" href="performance.html">
              <svg class="furo-related-icon"><use href="#svg-arrow-right"></use></svg>
              <div class="page-info">
                <div class="context">
                  <span>Previous</span>
                </div>
                
                <div class="title">Javet Performance</div>
                
              </div>
            </a>
        </div>
        <div class="bottom-of-page">
          <div class="left-details">
            <div class="copyright">
                Copyright &#169; 2021-2024. caoccao.com Sam Cao
            </div>
            Made with 
            <a href="https://github.com/pradyunsg/furo">Furo</a>
            
          </div>
          <div class="right-details">
            
          </div>
        </div>
        
      </footer>
    </div>
    <aside class="toc-drawer">
      
      
      <div class="toc-sticky toc-scroll">
        <div class="toc-title-container">
          <span class="toc-title">
            On this page
          </span>
        </div>
        <div class="toc-tree-container">
          <div class="toc-tree">
            <ul>
<li><a class="reference internal" href="#">Debug with Chrome Developer Tools</a><ul>
<li><a class="reference internal" href="#cdt-shell">CDT Shell</a><ul>
<li><a class="reference internal" href="#run-cdt-shell">1. Run CDT Shell</a></li>
<li><a class="reference internal" href="#run-script-in-cdt-shell">2. Run Script in CDT Shell</a></li>
<li><a class="reference internal" href="#open-cdt">3. Open CDT</a></li>
<li><a class="reference internal" href="#debug-as-usual">4. Debug as Usual</a></li>
</ul>
</li>
<li><a class="reference internal" href="#chrome-developer-tools-internals">Chrome Developer Tools Internals</a><ul>
<li><a class="reference internal" href="#handshake">Handshake</a></li>
</ul>
</li>
<li><a class="reference internal" href="#customization">Customization</a></li>
<li><a class="reference internal" href="#faqs">FAQs</a><ul>
<li><a class="reference internal" href="#does-it-support-node-js-mode">Does it Support Node.js Mode?</a></li>
<li><a class="reference internal" href="#is-there-a-live-demo">Is There a Live Demo?</a></li>
</ul>
</li>
</ul>
</li>
</ul>

          </div>
        </div>
      </div>
      
      
    </aside>
  </div>
</div><script src="../_static/documentation_options.js?v=f5d3a522"></script>
    <script src="../_static/doctools.js?v=9a2dae69"></script>
    <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
    <script src="../_static/scripts/furo.js?v=32e29ea5"></script>
    <script src="../_static/tabs.js?v=3ee01567"></script>
    </body>
</html>